#region Copyright (c) 2006-2009 Widgetsphere LLC, All Rights Reserved
//--------------------------------------------------------------------- *
//                          Widgetsphere  LLC                           *
//             Copyright (c) 2006-2009 All Rights reserved              *
//                                                                      *
//                                                                      *
//This file and its contents are protected by United States and         *
//International copyright laws.  Unauthorized reproduction and/or       *
//distribution of all or any portion of the code contained herein       *
//is strictly prohibited and will result in severe civil and criminal   *
//penalties.  Any violations of this copyright will be prosecuted       *
//to the fullest extent possible under law.                             *
//                                                                      *
//THE SOURCE CODE CONTAINED HEREIN AND IN RELATED FILES IS PROVIDED     *
//TO THE REGISTERED DEVELOPER FOR THE PURPOSES OF EDUCATION AND         *
//TROUBLESHOOTING. UNDER NO CIRCUMSTANCES MAY ANY PORTION OF THE SOURCE *
//CODE BE DISTRIBUTED, DISCLOSED OR OTHERWISE MADE AVAILABLE TO ANY     *
//THIRD PARTY WITHOUT THE EXPRESS WRITTEN CONSENT OF WIDGETSPHERE LLC   *
//                                                                      *
//UNDER NO CIRCUMSTANCES MAY THE SOURCE CODE BE USED IN WHOLE OR IN     *
//PART, AS THE BASIS FOR CREATING A PRODUCT THAT PROVIDES THE SAME, OR  *
//SUBSTANTIALLY THE SAME, FUNCTIONALITY AS ANY WIDGETSPHERE PRODUCT.    *
//                                                                      *
//THE REGISTERED DEVELOPER ACKNOWLEDGES THAT THIS SOURCE CODE           *
//CONTAINS VALUABLE AND PROPRIETARY TRADE SECRETS OF WIDGETSPHERE,      *
//INC.  THE REGISTERED DEVELOPER AGREES TO EXPEND EVERY EFFORT TO       *
//INSURE ITS CONFIDENTIALITY.                                           *
//                                                                      *
//THE END USER LICENSE AGREEMENT (EULA) ACCOMPANYING THE PRODUCT        *
//PERMITS THE REGISTERED DEVELOPER TO REDISTRIBUTE THE PRODUCT IN       *
//EXECUTABLE FORM ONLY IN SUPPORT OF APPLICATIONS WRITTEN USING         *
//THE PRODUCT.  IT DOES NOT PROVIDE ANY RIGHTS REGARDING THE            *
//SOURCE CODE CONTAINED HEREIN.                                         *
//                                                                      *
//THIS COPYRIGHT NOTICE MAY NOT BE REMOVED FROM THIS FILE.              *
//--------------------------------------------------------------------- *
#endregion
using System;
using System.Text;
using System.Xml;
using System.Linq;
using System.ComponentModel;
using System.Collections;
using Widgetsphere.Generator.Common.GeneratorFramework;
using Widgetsphere.Generator.Common.Util;
using System.Collections.Generic;
using Widgetsphere.Generator.ProjectItemGenerators;

namespace Widgetsphere.Generator.Models
{
  [
  Designer(typeof(Widgetsphere.Generator.Design.Designers.TableDesigner)),
  DesignTimeVisible(true),
  ]
  public class TableComposite : BaseModelObject
  {
    #region Member Variables

		protected Table _parent = null;
		protected string _name = "";
    protected ReferenceCollection _columns = null;

    #endregion

    #region Constructor

		public TableComposite(IModelObject root, Table parent)
			: base(root)
		{
			_parent = parent;
			_columns = new ReferenceCollection(this.Root, this, ReferenceType.Column);

			_columns.ObjectPlural = "Columns";
			_columns.ObjectSingular = "Column";
			_columns.ImageIndex = ImageHelper.GetImageIndex(ImageConstants.FolderClose);
			_columns.SelectedImageIndex = ImageHelper.GetImageIndex(ImageConstants.FolderOpen);

		}

    #endregion

    #region Property Implementations

		[Browsable(false)]
		public Table Parent
		{
			get { return _parent; }
		}
			
    [
    Browsable(true),
    Description("Determines the name of this component."),
    Category("Design"),
    DefaultValue("")
    ]
    public string Name
    {
      get { return _name; }
      set
      {
        _name = value;
        this.OnPropertyChanged(this, new PropertyChangedEventArgs("Name"));
      }
    }

    [
    Browsable(true),
    Description("Determines the columns that are associated with this table."),
    Category("Data"),
    TypeConverter(typeof(Widgetsphere.Generator.Design.Converters.ColumnReferenceCollectionConverter)),
    Editor(typeof(Widgetsphere.Generator.Design.Editors.ColumnReferenceCollectionEditor), typeof(System.Drawing.Design.UITypeEditor))
    ]
    public ReferenceCollection Columns
    {
      get { return _columns; }
    }

    #endregion

    #region IXMLable Members

    public override void XmlAppend(XmlNode node)
    {
      try
      {
        XmlDocument oDoc = node.OwnerDocument;
        XmlAttribute keyNode = oDoc.CreateAttribute("key");
        keyNode.Value = this.Key.ToString();
        node.Attributes.Append(keyNode);

        XmlAttribute name = oDoc.CreateAttribute("name");
        name.Value = this.Name;
        node.Attributes.Append(name);

        XmlNode columnsNode = oDoc.CreateElement("columns");
        this.Columns.XmlAppend(columnsNode);
        node.AppendChild(columnsNode);

      }
      catch(Exception ex)
      {
        throw;
      }

    }

    public override void XmlLoad(XmlNode node)
    {
      try
      {
        XmlNode columnsNode = node.SelectSingleNode("columns");
				if (columnsNode != null)
					this.Columns.XmlLoad(columnsNode);

				this.Name = node.Attributes["name"].Value;

        this.Dirty = false;
      }
      catch(Exception ex)
      {
        throw;
      }
    }

    #endregion

    #region Helpers

		[Browsable(false)]
		public string PascalName
		{
			get { return StringHelper.DatabaseNameToPascalCase(this.Name); }
		}

		public override string ToString()
		{
			string retval = this.Name;
			return retval;
		}

    #endregion

  }
}